<!DOCTYPE html>
<html lang="en"><head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1"><!-- Begin Jekyll SEO tag v2.8.0 -->
<title>0002: OOP Test Rig Breakdown | gtkDcoding</title>
<meta name="generator" content="Jekyll v4.3.4" />
<meta property="og:title" content="0002: OOP Test Rig Breakdown" />
<meta name="author" content="Ron Tarrant" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="Introduction to the OOP version of the GTK TestRig window - a D language tutorial." />
<meta property="og:description" content="Introduction to the OOP version of the GTK TestRig window - a D language tutorial." />
<link rel="canonical" href="http://localhost:4000/posts/0002-oop-test-rig.html" />
<meta property="og:url" content="http://localhost:4000/posts/0002-oop-test-rig.html" />
<meta property="og:site_name" content="gtkDcoding" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2019-01-18T00:00:00-05:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="0002: OOP Test Rig Breakdown" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"Ron Tarrant"},"dateModified":"2019-01-18T00:00:00-05:00","datePublished":"2019-01-18T00:00:00-05:00","description":"Introduction to the OOP version of the GTK TestRig window - a D language tutorial.","headline":"0002: OOP Test Rig Breakdown","mainEntityOfPage":{"@type":"WebPage","@id":"http://localhost:4000/posts/0002-oop-test-rig.html"},"url":"http://localhost:4000/posts/0002-oop-test-rig.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="stylesheet" href="../assets/main.css">
  <link rel="stylesheet" href="../css/style.css" /><link type="application/atom+xml" rel="alternate" href="http://localhost:4000/feed.xml" title="gtkDcoding" /></head>
<body><header class="site-header" role="banner">

  <div class="wrapper"><a class="site-title" rel="author" href="../">gtkDcoding</a><nav class="site-nav">
        <input type="checkbox" id="nav-trigger" class="nav-trigger" />
        <label for="nav-trigger">
          <span class="menu-icon">
            <svg viewBox="0 0 18 15" width="18px" height="15px">
              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
            </svg>
          </span>
        </label>

        <div class="trigger"><a class="page-link" href="../about.html">About</a><a class="page-link" href="../index-reverse.html">Posts in Date Order</a><a class="page-link" href="../topics.html">Blog Posts by Topic</a></div>
      </nav></div>
</header>
<main class="page-content" aria-label="Content">
      <div class="wrapper">
        <article class="post h-entry" itemscope itemtype="http://schema.org/BlogPosting">
	<header class="post-header">
		<link rel="stylesheet" href="../css/font_size.css" />
		<link rel="stylesheet" href="../css/figure.css" />
		<link rel="stylesheet" href="../css/topics/window.css" />  <!-- sub in the tag/topic -->
		<link rel="stylesheet" href="../css/modal.css" />
		<link rel="stylesheet" href="../css/post.css" />
		<link rel="stylesheet" href="../css/mascot_effects.css" />

		
		
		<p class="post-meta">
		<time class="dt-published" datetime="2019-01-18T00:00:00-05:00" itemprop="datePublished">Friday, January 18, 2019
		</time>• by <span itemprop="author" itemscope itemtype="http://schema.org/Person"><span class="p-author h-card" itemprop="name">Ron Tarrant</span></span></p>
	</header>

	<div class="post-content e-content" itemprop="articleBody">
		<div class="skew-line"></div>
		<h1 id="0002-oop-test-rig-breakdown">0002: OOP Test Rig Breakdown</h1>

<div class="screenshot-frame">
	<div class="frame-header">
		Results of this example:
	</div>
	<div class="frame-screenshot">
		<figure>
			<img id="img0" src="../images/screenshots/001_window/window_03.png" alt="Current example output" />	<!-- img# -->
			
			<!-- Modal for screenshot -->
			<div id="modal0" class="modal">																								<!-- modal# -->
				<span class="close0">&times;</span>																					<!-- close# -->
				<img class="modal-content" id="img00" />																					<!-- img## -->
				<div id="caption"></div>
			</div>
			
			<script>
			// Get the modal
			var modal = document.getElementById("modal0");																			// modal#
			
			// Get the image and insert it inside the modal - use its "alt" text as a caption
			var img = document.getElementById("img0");																				// img#
			var modalImg = document.getElementById("img00");																		// img##
			var captionText = document.getElementById("caption");

			img.onclick = function()
			{
			  modal.style.display = "block";
			  modalImg.src = this.src;
			  captionText.innerHTML = this.alt;
			}
			
			// Get the <span> element that closes the modal
			var span = document.getElementsByClassName("close0")[0];															// close#
			
			// When the user clicks on <span> (x), close the modal
			span.onclick = function()
			{ 
				modal.style.display = "none";
			}
			</script>
			<figcaption>
			Current example output
			</figcaption>
		</figure>
	</div>

	<div class="frame-terminal">
		<figure class="right">
			<img id="img1" src="../images/screenshots/001_window/window_03_term.png" alt="Current example terminal output" /> <!-- img#, filename -->

			<!-- Modal for terminal shot -->
			<div id="modal1" class="modal">																												<!-- modal# -->
				<span class="close1">&times;</span>																										<!-- close# -->
				<img class="modal-content" id="img11" />																									<!-- img## -->
				<div id="caption"></div>
			</div>
			
			<script>
			// Get the modal
			var modal = document.getElementById("modal1");																							// modal#
			
			// Get the image and insert it inside the modal - use its "alt" text as a caption
			var img = document.getElementById("img1");																								// img#
			var modalImg = document.getElementById("img11");																						// img##
			var captionText = document.getElementById("caption");

			img.onclick = function()
			{
			  modal.style.display = "block";
			  modalImg.src = this.src;
			  captionText.innerHTML = this.alt;
			}
			
			// Get the <span> element that closes the modal
			var span = document.getElementsByClassName("close1")[0];																				// close#
			
			// When the user clicks on <span> (x), close the modal
			span.onclick = function()
			{ 
				modal.style.display = "none";
			}
			</script>

			<figcaption>
				Current example terminal output (click for enlarged view)
			</figcaption>
		</figure>
	</div>

	<div class="frame-footer">																																<!-- filename (below)-->
		The code file for this example is available <a href="https://github.com/rontarrant/gtkd_demos/blob/master/001_window/window_03_oop.d" target="_blank">here</a>.
	</div>
</div>

<p>When you look at the imperative test rig alongside this OOP version, it becomes quickly apparent that the difference is mostly about code organization.</p>

<h2 id="main">main()</h2>

<p>The changes start in the <code class="language-plaintext highlighter-rouge">main()</code> function:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="n">main</span><span class="p">(</span><span class="nb">string</span><span class="p">[]</span> <span class="n">args</span><span class="p">)</span>
<span class="p">{</span>
	<span class="n">TestRigWindow</span> <span class="n">testRigWindow</span><span class="p">;</span>
	
	<span class="n">Main</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>
	
	<span class="n">testRigWindow</span> <span class="p">=</span> <span class="k">new</span> <span class="n">TestRigWindow</span><span class="p">();</span>
		
	<span class="n">Main</span><span class="p">.</span><span class="n">run</span><span class="p">();</span>
	
<span class="p">}</span> <span class="c1">// main()</span>
</code></pre></div></div>

<p>On line 2 of <code class="language-plaintext highlighter-rouge">main()</code>, the window declaration is quite different because instead of instantiating the <code class="language-plaintext highlighter-rouge">MainWindow</code> class directly, there’s a derived class called <code class="language-plaintext highlighter-rouge">TestRigWindow</code>. We also move any calls to the <code class="language-plaintext highlighter-rouge">TestRigWindow</code> functions to the <code class="language-plaintext highlighter-rouge">TestRigWindow</code> class’s constructor which strips <code class="language-plaintext highlighter-rouge">main()</code> down to the bare essentials.</p>

<h2 id="quitapp">quitApp()</h2>

<p><code class="language-plaintext highlighter-rouge">quitApp()</code> is no longer a standalone function as it’s been incorporated into the <code class="language-plaintext highlighter-rouge">TestRigWindow</code> class which looks like this:</p>

<div class="language-d highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="n">TestRigWindow</span> <span class="p">:</span> <span class="n">MainWindow</span>
<span class="p">{</span>
	<span class="nb">string</span> <span class="n">title</span> <span class="p">=</span> <span class="s">"Test Rig"</span><span class="p">;</span>
	
	<span class="k">this</span><span class="p">()</span>
	<span class="p">{</span>
		<span class="k">super</span><span class="p">(</span><span class="n">title</span><span class="p">);</span>
		<span class="n">addOnDestroy</span><span class="p">(&amp;</span><span class="n">quitApp</span><span class="p">);</span>

		<span class="n">sayHi</span><span class="p">();</span>
	
		<span class="n">showAll</span><span class="p">();</span>
		
	<span class="p">}</span> <span class="c1">// this()</span>
	
		
	<span class="kt">void</span> <span class="n">quitApp</span><span class="p">(</span><span class="n">Widget</span> <span class="n">widget</span><span class="p">)</span>
	<span class="p">{</span>
		<span class="nb">string</span> <span class="n">exitMessage</span> <span class="p">=</span> <span class="s">"Bye."</span><span class="p">;</span>
		
		<span class="n">writeln</span><span class="p">(</span><span class="n">exitMessage</span><span class="p">);</span>
		
		<span class="n">Main</span><span class="p">.</span><span class="n">quit</span><span class="p">();</span>
		
	<span class="p">}</span> <span class="c1">// quitApp()</span>


	<span class="kt">void</span> <span class="n">sayHi</span><span class="p">()</span>
	<span class="p">{</span>
		<span class="nb">string</span> <span class="n">message</span> <span class="p">=</span> <span class="s">"Hello GtkD OOP World"</span><span class="p">;</span>
		
		<span class="n">writeln</span><span class="p">(</span><span class="n">message</span><span class="p">);</span>
		
	<span class="p">}</span> <span class="c1">// sayHi()</span>

<span class="p">}</span> <span class="c1">// class TestRigWindow</span>
</code></pre></div></div>

<p>The first function is the constructor. D uses <code class="language-plaintext highlighter-rouge">this()</code> instead of  the class name (like Java) or <code class="language-plaintext highlighter-rouge">construct()</code> (like PHP) and inside we:</p>

<ul>
  <li>call <code class="language-plaintext highlighter-rouge">super()</code>, a shorthand for calling the parent class’s constructor,</li>
  <li>while passing along the window’s title, and</li>
  <li>hook up the window’s close button.</li>
</ul>

<h4 id="order-matters">Order Matters</h4>

<p>It’s important to note here that any call to a function that will decorate the <code class="language-plaintext highlighter-rouge">TestRigWindow</code>—or size it or pretty much anything else—must be made <em>after</em> the call to <code class="language-plaintext highlighter-rouge">super()</code>. Otherwise, the window won’t exist, the function call goes off into oblivion, and we’ll get an error.</p>

<p>You’ll notice that connecting the <code class="language-plaintext highlighter-rouge">onDestroy</code> signal is done differently here. In the imperative version, because <code class="language-plaintext highlighter-rouge">quitApp()</code> is external to <code class="language-plaintext highlighter-rouge">main()</code>, we have to preserve <code class="language-plaintext highlighter-rouge">quitApp</code>’s scope so it doesn’t disappear on us before we can use it. But in the OOP version, the syntax is simplified because we don’t need to worry about scope. As long as the class object exists, everything within it will exist as well. This simplification of syntax makes our job easier, although it’ll get difficult again under certain circumstances. I’ll talk about that in later posts.</p>

<p>Another thing you’ll notice is that <code class="language-plaintext highlighter-rouge">TestRigWindow</code>’s <code class="language-plaintext highlighter-rouge">sayHi()</code> function has taken the place of a simple <code class="language-plaintext highlighter-rouge">writeln()</code> call in the imperative version of <code class="language-plaintext highlighter-rouge">main()</code>. We could have left it where it was, but this way all functions are part of the <code class="language-plaintext highlighter-rouge">TestRigWindow</code> class and there’s a certain orderliness to that.</p>

<p>As with all examples, to compile:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dmd -de -w -m64 -Lgtkd.lib &lt;filename&gt;.d
</code></pre></div></div>

<h2 id="conclusion">Conclusion</h2>

<p>So, now we have two test rigs and we’ve looked at how to size a window to exact specifications. That gives us a foundation to build from in the coming posts.</p>

<p>Until next time when we take an initial look at GUI buttons, happy D-coding and may the widgets be with you.</p>

<div class="blog-nav">
	<div style="float: left;">
		<a href="./0001-imperative-test-rig.html">Previous: The Imperative Test Rig</a>
	</div>
	<div style="float: right;">
		<a href="./0003-add-a-button.html">Next: Add a Button</a>
	</div>
</div>
<p>
	<h3></h3>
<div class="inpage-frame">
	<a href="https://github.com/sponsors/rontarrant">
		<BR>
		<BR>
		<B>Is this article useful? Educational? Entertaining, perhaps?</B>
		<BR>
		<figure class="left">
			<img src="../images/favorite_32.png" alt="Sponsorship heart" style="width: 32px; height: 32px;">
		</figure>
		You're free to accept or decline this invitation to become our newest sponsor.
	</a>
</div>
	<h4 class="comment-blurb"><B>Comments? Questions? Observations?</B></h4>
	<p>
		Did we miss a tidbit of information that would make this post even more informative? Let's talk about it in the comments.
	</p>
	<script src="https://utteranc.es/client.js"
		repo="rontarrant"
		issue-term="pathname"
		theme="github-light"
		crossorigin="anonymous"
		async>
	</script>
	<ul>
		<li> come on over to the <a href="https://forum.dlang.org/">D Language Forum</a> and look for one of the <i>gtkDcoding</i> announcement posts, </li>
		<li> drop by <a href="https://forum.gtkd.org/">the <i>GtkD Forum</i></a>,</li>
		<li> follow the link below to email me, or</li>
		<li> go to the	<a href="https://www.facebook.com">gtkDcoding Facebook page.</a></li>
	</ul>
</p>
<p> You can also subscribe <a href="/feed.xml">via RSS</a> so you won't miss anything. Thank you very much for dropping by.</p>
<p>&copy; Copyright 2025 Ron Tarrant </p>
</div>

	<a class="u-url" href="./0002-oop-test-rig.html" hidden></a>
</article>

      </div>
    </main><footer class="site-footer h-card">
  <data class="u-url" href="/"></data>

  <div class="wrapper">

    <h2 class="footer-heading">gtkDcoding</h2>

    <div class="footer-col-wrapper">
      <div class="footer-col footer-col-1">
        <ul class="contact-list">
          <li class="p-name">Ron Tarrant</li><li><a class="u-email" href="mailto:gtkDcoding@gmail.com">gtkDcoding@gmail.com</a></li></ul>
      </div>

      <div class="footer-col footer-col-2"><ul class="social-media-list"><li><a href="https://github.com/rontarrant"><svg class="svg-icon"><use xlink:href="../assets/minima-social-icons.svg#github"></use></svg> <span class="username">rontarrant</span></a></li></ul>
</div>

      <div class="footer-col footer-col-3">
        <p>Simple examples of how to use GtkD to build GUI applications.</p>
      </div>
    </div>

  </div>

</footer>
</body>

</html>
